/**
 * @file    huyi_sms.c
 * @brief   使用互亿无线短信api向指定手机号发送验证码
 * @author  zyh <2972140442@qq.com>
 * @date    2025-06-27
 * @license GPL-2.0
 * @note    请先注册互亿无线"https://www.ihuyi.com/"获取其短信接口服务，将APIID，
 *          APIKEY替换到指定的宏上，手机号和验证码内容可
 *          以使用宏，也可以从其他地方获取输入，请自行修改。
 */

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <errno.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define DOMAIN  "106.ihuyi.com"                     // 服务器域名
#define PORT    80                                  // 服务器端口
#define BUFSIZE 4096                                // 接收缓冲区大小
#define APIID   "*********"                         // 接口ID
#define APIKEY  "********************************"  // 接口密钥
#define MOBILE  "***********"                       // 接收验证码手机号
#define CONTENT "****"                              // 验证码内容

int main(int argc, char **argv)
{
    // 根据域名获取IP地址
    struct hostent *host;
    host = gethostbyname(DOMAIN);
    if ( NULL == host )
    {
        printf("gethostbyname failed,error: %d\n", h_errno);
        exit(EXIT_FAILURE);        
    }
    //创建套接字
    int sockfd;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) 
    { 
        printf("create connect error!\n"); //创建网络连接失败
        exit(0);
    }

    // 创建并初始化服务器信息结构体
    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr)); //每个字节都用0填充
    servaddr.sin_family = AF_INET; //使用IPv4地址
    servaddr.sin_port = htons(PORT); //端口
    servaddr.sin_addr = *((struct in_addr *)host->h_addr);

    // 创建连接
    if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("connect error!\n");
        exit(0);
    }
    printf("connect success!\n\n");

    // 创建HTTP请求头部
    char str[4096], str1[4096], str2[4096];
    memset(str2, 0, 4096);
    sprintf(str2, "account=%s&password=%s&mobile=%s&content=您的验证码是：%s。请不要把验证码泄露给其他人。", APIID, APIKEY, MOBILE, CONTENT);

    int len = strlen(str2);
    memset(str1, 0, 4096);
    sprintf(str1, "Content-Length: %d\r\n\r\n", len);
    printf("str1:%s",str1);

    memset(str, 0, 4096);
    sprintf(str,    
            "POST /webservice/sms.php?method=Submit&format=json HTTP/1.1\r\n"
            "Host: " DOMAIN "\r\n"
            "Content-Type: application/x-www-form-urlencoded\r\n" 
            );
    strcat(str, str1);
    strcat(str, str2);

    // 输出请求头部的内容
    printf("Request Data: \n%s\n",str);

    // 发送HTTP请求
    int ret = write(sockfd,str,strlen(str));
    if (ret < 0) 
    {
        printf("send data fail！errno:%d, errmsg:'%s'\n\n",errno, strerror(errno));
        exit(0);
    }
    else
    {
        printf("send data success, length:%d byte!\n\n", ret);
    }

    // 接收HTTP回复
    char buf[BUFSIZE];
    memset(buf, 0, 4096);
    int i= read(sockfd, buf, 4095);
    if (i==0)
    {
        close(sockfd);//关闭套接字
        printf("0.connect close！\n"); //读取数据报文时发现远端关闭
        return -1;
    }
    printf("Response Data: \n%s\n", buf);
    close(sockfd);//关闭套接字
    printf("1.connect close！\n");

    return 0;
}